/**
 * \file   npasm.cpp
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 * 
 */
#include <iostream>
#include <stdlib.h>
#include "entorno.h"
#include "npasm.h"
#include "opciones.h"
#include "opcode.h"
#include "auxiliar.h"
#include "hex.h"
using namespace std;

entorno *Entorno;

/** Esta funcion es amiga de la clase \a entorno */
int main(int argc, char *const *argv)
{	
	try {
		/* Configuraciones iniciales */
		Entorno = new entorno;
		Entorno->SetPaso(0);
		opciones(argc, argv);
		opcodes();
		Entorno->Nombres();
		Entorno->m->CargarLnk();
		
		/* Primer paso */
		Entorno->SetPaso(1);
		Entorno->AbrirFuente();
		yyparse();
		Entorno->CerrarFuente();
		
		/* Segundo paso */
		Entorno->m->ReiniciarPunteros();
		Entorno->SetPaso(2);
		Entorno->AbrirFuente(true /* reset */);
		yyparse();
		Entorno->CerrarFuente();
		
		/* Generar HEX */
		generar_hex();
	}
	catch(string e) {
		cerr << "npasm: ";
		if(Entorno->GetPaso())
			cerr << "(" << Entorno->GetLinea() << "): ";
		cerr << e << endl;
		return 1;
	}
	
	return 0;
}

void Ayuda(char c)
{
	if(c == 'v') {
		cout << NPASM << endl;
		exit(0);
	}
	cout <<
	  "Usar: npasm <opciones> fuente\n"
	  "Opciones:\n"
	  " --define   -D  Define una macro\n"
	  " --help     -h  Muestra esta ayuda y termina\n"
	  " --incdir   -I  Directorio para busqueda de cabeceras\n"
	  " --output   -o  Especifica el nombre del archivo de salida\n"
	  " --version  -v  Muestra la version y termina\n"
	;
	exit(0);
}

void yyerror(const char *)
{
	throw(string("error sintactico"));
}
